package cn.com.anypay.manager.miaoma.student.dto;

import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.ToString;

import java.util.List;
import java.util.ArrayList;

/**
 * 学生批量操作DTO
 * 用于批量导入、导出、删除等操作
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class StudentBatchDTO {

    /**
     * 批量操作的学生ID列表
     */
    @NotEmpty(message = "学生ID列表不能为空")
    @Size(max = 1000, message = "批量操作数量不能超过1000条")
    private List<Long> studentIds;

    /**
     * 批量操作的学生数据列表
     */
    @Size(max = 1000, message = "批量操作数量不能超过1000条")
    private List<StudentDTO> students;

    /**
     * 操作类型
     */
    private BatchOperationType operationType;

    /**
     * 批量更新的字段（用于部分字段更新）
     */
    private BatchUpdateDTO updateFields;

    /**
     * 导入/导出相关设置
     */
    private ImportExportSettings settings;

    /**
     * 批量操作类型枚举
     */
    public enum BatchOperationType {
        INSERT("批量新增"),
        UPDATE("批量更新"),
        DELETE("批量删除"),
        IMPORT("批量导入"),
        EXPORT("批量导出"),
        STATUS_CHANGE("批量状态变更");

        private final String description;

        BatchOperationType(String description) {
            this.description = description;
        }

        public String getDescription() {
            return description;
        }
    }

    /**
     * 批量更新字段DTO
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public static class BatchUpdateDTO {
        private String className;
        private Integer status;
        private String remark;
        // 可以根据需要添加其他允许批量更新的字段
    }

    /**
     * 导入导出设置
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public static class ImportExportSettings {
        /**
         * 是否覆盖已存在的数据
         */
        @Builder.Default
        private Boolean overwriteExisting = false;

        /**
         * 是否跳过错误数据继续处理
         */
        @Builder.Default
        private Boolean skipErrors = true;

        /**
         * 导出文件格式 (EXCEL, CSV)
         */
        @Builder.Default
        private ExportFormat exportFormat = ExportFormat.EXCEL;

        /**
         * 是否包含表头
         */
        @Builder.Default
        private Boolean includeHeader = true;

        /**
         * 导出的字段列表（为空则导出所有字段）
         */
        private List<String> exportFields;
    }

    /**
     * 导出格式枚举
     */
    public enum ExportFormat {
        EXCEL("Excel格式"),
        CSV("CSV格式"),
        PDF("PDF格式");

        private final String description;

        ExportFormat(String description) {
            this.description = description;
        }

        public String getDescription() {
            return description;
        }
    }

    /**
     * 验证批量操作数据
     */
    public boolean isValidForOperation() {
        if (operationType == null) {
            return false;
        }

        return switch (operationType) {
            case DELETE, STATUS_CHANGE -> studentIds != null && !studentIds.isEmpty();
            case INSERT, IMPORT -> students != null && !students.isEmpty();
            case UPDATE -> (studentIds != null && !studentIds.isEmpty()) ||
                          (students != null && !students.isEmpty());
            case EXPORT -> true; // 导出可以没有具体数据，使用查询条件
        };
    }

    /**
     * 获取操作数量
     */
    public int getOperationCount() {
        return switch (operationType) {
            case DELETE, STATUS_CHANGE -> studentIds != null ? studentIds.size() : 0;
            case INSERT, UPDATE, IMPORT -> students != null ? students.size() : 0;
            case EXPORT -> 0; // 导出数量需要根据查询条件确定
        };
    }
}